package com.xp.record25.bio.nio;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;

@Slf4j
public class SelectorTest {

    public static void main(String[] args) throws IOException {
        //首先创建一个选择器
        Selector selector = Selector.open();
        //创建一个服务器 channel
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        //绑定服务器channel端口
        ssc.bind(new InetSocketAddress(8888));
        //将channel注册到 选择器上 ,并获得一个选择器键，这个选择器键是专属于这个 chnnel的么？
        // 这里还必须得设置为非阻塞得才可以绑定到选择器上
        SelectionKey selectionKey = ssc.register(selector, 0, null);
        System.out.printf("选择键为：%s, 注册的channel 为：%s %n",selectionKey,ssc);
        //选择器选择感兴趣的事件,对连接事件感兴趣 这里的事件是分了角色的 服务端不能建立对 connect 的兴趣 这里会报错
        //这里的accept 是服务端监测到有连接想要建立
        selectionKey.interestOps(SelectionKey.OP_ACCEPT);
                //再试试这个api,
//                .interestOpsAnd(SelectionKey.OP_CONNECT);
        while (true) {
            //阻塞等待事件发生
            int select = selector.select();
            //事件发生后，获取发生的事件
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> iterator = selectionKeys.iterator();
            while (iterator.hasNext()) {
                SelectionKey sk1 = iterator.next();

                System.out.println("选择键为："+ sk1);
                // 这里获取触发当前事件的 channel 应该是最开始的channel
                ServerSocketChannel channel = (ServerSocketChannel) sk1.channel();
                System.out.println("这个选择键绑定得channel是：" + channel);
                //允许建立连接
                SocketChannel sc = channel.accept();
                System.out.println("这个连接的channel是 ："+ sc);

            }


        }



    }
}
